
from django.http import HttpResponse
from django.shortcuts import render, redirect
# 导入支付宝配置
from utils.alipay_object import alipay_obj
from django.conf import settings

from django.http import JsonResponse

from .models import *

# 定时删除验证码
from threading import Timer


# 验证码全局变量（用来删除）
randomMsg = ''


def register(request):
    #print(request.GET)
    #print(request.POST)
    # 接受前端请求
    username = request.POST.get('username')
    userpsd = request.POST.get('userpsd')
    userphone = request.POST.get('userphone')
    # 数据处理 间接利用数据模型操作数据库 引入pymql在init中
    if username == '':
        return HttpResponse('账号不能为空！')
    if userpsd == '':
        return HttpResponse('密码不能为空！')
    if userphone == '':
        return HttpResponse('手机号不能为空！')
    if user.objects.filter(username=username):
        return HttpResponse('此账号已注册！')
    elif user.objects.filter(userphone=userphone):
        return HttpResponse('该手机号已注册！')
    elif user.objects.filter(username=userphone):
        return HttpResponse('该用户名已存在！')
    else:
        user.objects.create(username=username, userpassword=userpsd, userphone=userphone)
        return HttpResponse('注册成功！')

def loginpsd(request):
    #print(request.GET)
    #print(request.POST)
    # 接受前端请求  可能是手机号或者是用户名
    username = request.POST.get('username')
    userpsd = request.POST.get('userpsd')
    # 数据处理 间接利用数据模型操作数据库 引入pymql在init中
    if user.objects.filter(username=username) or user.objects.filter(userphone=username):
        if user.objects.filter(userpassword=userpsd):
            #将用户名保存到session里面 显示用户名
            request.session['username'] = username
            return HttpResponse('登陆成功！')
        else:
            return HttpResponse('密码错误！请重新输入')
    else:
        return HttpResponse('账号错误！')


def sendmsg(request):
    #print(request.GET)
    #print(request.POST)
    # 接受前端请求
    phone = request.POST.get('phone')
    msg = request.POST.get('msg')
    # 数据处理 间接利用数据模型操作数据库 引入pymql在init中
    if phone == '':
        return HttpResponse('手机号不能为空！')
    #手机号存在 发送验证码
    if user.objects.filter(userphone=phone):
        # 生成并发送验证码 保留随机验证码
        import string
        import random
        # string.digits是一个定义好的数字字符串，就是从"0123456789"。
        # sample方法的随机数是不会重复的
        seeds = string.digits
        random_str = random.choices(seeds, k=4)
        random_STR = "".join(random_str)
        # 将验证码保存到全局 申明全局变量  问题：需要使用数据库存储验证码 （关闭网页就G 假设上线了 多个用户同时进行登陆 会更改全局变量导致未知的错误）
        # 采用全局来定时删除数据库中验证码

        global randomMsg
        randomMsg = random_STR
        print(random_STR)

        #将验证码存储到数据库 msg表中
        phonemsg.objects.create(msg=random_STR)
        #发送验证码
        import urllib.parse
        import urllib.request
        # 接口地址
        url = 'http://106.ihuyi.com/webservice/sms.php?method=Submit'
        # 定义请求的数据
        values = {
            'account': '自己互亿无线的acount',
            'password': '自己的password',
            'mobile': phone,
            'content': '您的验证码是：' + random_STR + '。请不要把验证码泄露给其他人。',
            'format': 'json',
        }
        # 将数据进行编码
        data = urllib.parse.urlencode(values).encode(encoding='UTF8')
        # 发起请求
        req = urllib.request.Request(url, data)
        response = urllib.request.urlopen(req)
        res = response.read()
        # 打印结果
        print(res.decode("utf8"))

        # 定时删除验证码（5分钟）
        def deletemsg():
            phonemsg.objects.filter(msg=randomMsg).delete()
        # 5分钟后删除该数据
        t = Timer(300, deletemsg)
        t.start()
        return HttpResponse('验证码发送成功')
    else:
        return HttpResponse('手机号未注册 验证码发送失败！')

def loginmsg(request):
    #print(request.GET)
    #print(request.POST)
    # 接受前端请求  可能是手机号或者是用户名

    phone = request.POST.get('phone')
    msg = request.POST.get('msg')
    # 数据处理 间接利用数据模型操作数据库 引入pymql在init中
    if phone == '':
        return HttpResponse('手机号不能为空！')
    if msg == '':
        return HttpResponse('验证码不能为空！')
    if phonemsg.objects.filter(msg=msg):
        # 登陆后验证码失效
        phonemsg.objects.filter(msg=msg).delete()
        # 将手机号保存到session里面 显示用户名
        request.session['username'] = phone
        return HttpResponse('登陆成功！')
    else:
        return HttpResponse('验证码错误！请重新输入')


#页面
def index_taobao(request):
    return render(request, "taobao.html")


def login_taobao(request):
    return render(request, "login.html")

def register_taobao(request):
    return render(request, "register.html")

def login_success_taobao(request):
    # 通过session获取登陆成功时的用户名 并返回
    username = request.session.get('username')
    # 获取商品表中的信息 并返回 由于必须返回一个元组所以 需要对数据库中返回的数据做处理
    good = goods.objects.filter(goodsid=1)

    return render(request, "loginsuccess.html", {'username': username, 'good': good})


def details_goods(request):
    # 通过session判断是否登陆
    if request.session.get('username',None):
        #获取userid并保存在session中
        #userid = request.POST.get('userid')
        #request.session['userid'] = userid
        #uid = request.session.get('userid')
        #print(uid)
        # 获取用户
        username = request.session.get('username')
        userid = user.objects.filter(username=username)
        #获取商品表中的数据
        good = goods.objects.filter(goodsid=1)
        return render(request, 'taobao_detail.html', {'good': good, 'userid': userid})
    else:
        return redirect('/login/')

def shopping_car(request):
    # 接收加入购物车的请求数据  商品名称 商品图片 商品价格 （地址？） 商品数量 商品颜色（尺寸）
    # goodsname = request.POST.get('goodsname')
    # goodsimg = request.POST.get('goodsimg')
    # goodsprice = request.POST.get('goodsprice')
    goodscount = request.POST.get('goodscount')
    goodscolor = request.POST.get('goodscolor')

    goodsid = request.POST.get('goodsid')
    uid = request.POST.get('userid')

    # 如果商品加入过购物车 count+1
    if goodsid:
        shoppingcar.objects.create(userid=uid, goodsid=goodsid, size=goodscolor, count=goodscount)

    # 根据gid获取购物车表信息
    good = goods.objects.filter(goodsid=1)
    good_count_color = shoppingcar.objects.filter(goodsid=1)
    # print(goodslist)
    return render(request, 'shoppingcar.html', {'good': good, 'good_count_color': good_count_color})


# 退出登陆
def loginout(request):
    request.session.pop('username')
    return redirect('/index/')

# 支付宝沙箱支付
def good_pay(request):
    alipay = alipay_obj()
    # 生成支付路由
    # 拼接url--返回url
    # 电脑网站支付，需要跳转到：https://openapi.alipay.com/gateway.do? + order_string

    # 产生一个9位的随机数 数字可重复 digits是0到9的数字字符
    import random
    import string
    seeds = string.digits
    random_str = random.choices(seeds, k=9)
    random_STR = "".join(random_str)

    order_string = alipay.api_alipay_trade_page_pay(
        # 这里的数据 应该都是从数据库里面获取 由于数据库设计的太烂了 这里主要实现功能
        # 由于只有一个商品那么就写死了...
        # 尝试过前端获取 但是支付时又是一个请求
        out_trade_no=random_STR,  # 商品订单号  唯一的
        total_amount=40,  # 商品价格
        subject='卫新 薰衣草洗衣液 4.26kg',  # 商品的名称
        return_url=settings.ALIPAY_SETTING.get('ALIPAY_RETURN_URL'),  # 同步回调网址--用于前端，付成功之后回调
        notify_url=settings.ALIPAY_SETTING.get('ALIPAY_NOTIFY_URL')  # 异步回调网址---后端使用，post请求，网站未上线，post无法接收到响应内容
    )
    # 我这里大概讲一下为什么要有同步/异步，因为同步是前端的，
    # 如果前端出现页面崩了，那么校验有后端完成，
    # 而且在实际开发中，后端一定要校验，因为前端的校验，可被修改
    url = 'https://openapi.alipaydev.com/gateway.do' + '?' + order_string
    return JsonResponse({'url': url, 'status': 1})

# 1.同步回调（后端校验） 其中是阻塞的 需要返回结果才能继续执行 其中如果前端页面崩溃 那么这时异步回调就起作用了
# 2.异步回调（后端校验） 其中前端崩溃 支付宝会向回调路由发送8次post请求 这时能保证商品支付不出现误差！！！

def check_html_view(request):
    if request.method == "GET":
        # 进行校验，因为支付成功之后，后端是不知道是否成功的，所以需要校验一下
        alipay = alipay_obj()
        data = request.GET.dict()  # 把get请求的参数转换成字典
        signature = data.pop("sign")  # 把sign pop出去
        # verification
        success = alipay.verify(data, signature)  # success ----> True False
        if success:
            # 如果成功支付了，这个success是True
            # 接着写逻辑了，比如修改当前订单的状态
            # 我举一个例子
            print('支付成功，后台已经校验过了，金币+1')
            return HttpResponse('支付成功！')
        return HttpResponse('支付失败')

    # post 请求异步回调校验，最后一定要返回一个success
    alipay = alipay_obj()
    data = request.GET.dict()
    signature = data.pop("sign")
    # verification
    success = alipay.verify(data, signature)  # True False
    if success and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):
        print('支付成功，后台已经校验过了，金币+1')
        return HttpResponse('支付成功！')
    return HttpResponse('支付失败')